package cn.jly.bigdata.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author lanyangji
 * @date 2019/11/24 10:47
 */
object Spark02_expr18 {

  def main(args: Array[String]): Unit = {

    // local模式

    // 创建 SparkConf 对象
    // 这边也自定义了本地的模式（分配多少个cpu）
    // app id
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")

    // 创建spark上下文对象，SparkContext -> sc
    val sc = new SparkContext(sparkConf)

    val arrayRDD: RDD[(String, Int)] = sc.makeRDD(Array(("a", 88), ("b", 95), ("a", 91), ("b", 93), ("a", 95), ("b", 98)), 2)

    // 需求，相同的key,求值的均值
    val combineRDD: RDD[(String, (Int, Int))] = arrayRDD.combineByKey(
      (_, 1), // 将第一次出现的key的v,转换为（v,1)的格式
      (tu: (Int, Int), v) => (tu._1 + v, tu._2 + 1), // 将相同key的v与先前的(v, n)的第一个v相加，n+1，并二元组返回
      (tu1: (Int, Int), tu2: (Int, Int)) => (tu1._1 + tu2._1, tu1._2 + tu2._2) // 对各个分区间key相同的（v,n）合并
    )

    // 多个参数我们用模式匹配处理，方便对应参数
    val resRDD: RDD[(String, Double)] = combineRDD.map {
      case (key, value) => (key, value._1 / value._2.toDouble)
    }

    val res: Array[Array[(String, Double)]] = resRDD.glom().collect()
    for (elem <- res) {
      println(elem.mkString(","))
    }
  }
}
